#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
const int N=1e6+50;
int n,m,x;
int cnt[N];
vector<pii> res;
int main(void){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&x);
            res.push_back(make_pair(x,i));
        }
    }
    //将矩阵平铺记录行号存入vector并排序
    sort(res.begin(),res.end());
    //ans为最终最小差值 tmp为从各列取出的个数
    int ans=INF,tmp=0,p=0;
    for(int i=0;i<res.size();i++){
        //窗口右移，加入右边元素
        while(p!=res.size() && tmp<n){
            int x=res[p].second;
            cnt[x]++;
            //x列第一次取
            if(cnt[x]==1){
                tmp++;
            }
            p++;
        }
        //当每列都取一个数时，更新差值
        if(tmp==n){
            ans=min(ans,res[p-1].first-res[i].first);
        }
        //窗口右移，左边元素删掉
        int x=res[i].second;
        cnt[x]--;
        if(cnt[x]==0){
            tmp--;
        }
    }
    printf("%d\n",ans);
    return 0;
}